# @Time : 2024-10-23 17:05
# @Author : Fioman 
# @Phone : 13149920693
"""
多态(Polymorphism)指的是不同的类型的对象可以用相同的接口进行操作,可以作用在不同类型的对象实现,
进而表现为不同的行为.
多态通常出现在:
1) 继承和方法重写,通过重写父类的方法,实现不同的行为
2) 函数或者接口接收不同类型的对象,而无需关心这些对象的实际类型,只要他们都实现了某个行为
"""


class Animal:
    def speak(self):
        pass


class Dog(Animal):
    def speak(self):
        return "狗在叫"


class Cat(Animal):
    def speak(self):
        return "猫在叫"


class Duck(Animal):
    def speak(self):
        return "鸭子在叫"


# 定义一个函数,它可以处理任何具有speak方法的对象
def make_animal_speak(animal: Animal):
    print(animal.speak())


# 实例化不同类型的动物
dog = Dog()
cat = Cat()
duck = Duck()
# 利用多态性,传入不同的动物对象
make_animal_speak(dog)
make_animal_speak(cat)
make_animal_speak(duck)

# 鸭子类型
"""
只要一个动物它看起来像个鸭子,具有鸭子的一些行为,它就可以称之为鸭子类型.
只要实现了某种行为(方法或者属性),那么无论它实际类型是什么,都会被认为是可行的.
鸭子类型不关心对象的具体类型,而是关心是否具有特定的行为.
1) 提高代码灵活性
2) 减少类型检查
3) 在动态语言,比如Python中特别适合
"""


class Dog:
    def speak(self):
        return "狗在叫"


class Cat:
    def speak(self):
        return "猫在叫"


class Robot:
    def speak(self):
        return "兔子在叫"


# 定义一个函数,只要传入的对象具有speak属性,都可以成立

def make_speak(obj):
    print(obj.speak())


dog = Dog()
cat = Cat()
robot = Robot()

make_speak(dog)
make_speak(cat)
make_speak(robot)

"""
多态和鸭子类型的关系:
1) 传统的多态依赖于继承,接口和重写
2) python中的多态大多通过鸭子类型来实现,只关注是否提供了某种行为,更加的灵活.
"""
